package com.penghaisoft.microwms.material.web.intowarehouse.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.penghaisoft.microwms.common.Constant;
import com.penghaisoft.microwms.common.dto.Resp;
import com.penghaisoft.microwms.common.page.Pager;
import com.penghaisoft.microwms.common.service.BaseService;
import com.penghaisoft.microwms.common.wms.model.MSBarCode;
import com.penghaisoft.microwms.common.wms.model.RawBarcode;
import com.penghaisoft.microwms.common.wms.model.RawCarCheckIn;
import com.penghaisoft.microwms.material.web.intowarehouse.dao.MSBarCodeMapper;
import com.penghaisoft.microwms.material.web.intowarehouse.dao.RawBarcodeMapper;
import com.penghaisoft.microwms.material.web.intowarehouse.dao.RawCarCheckInMapper;
import com.penghaisoft.microwms.material.web.intowarehouse.service.IRawCarCheckInService;

/**
 * @Description 原材料车辆登记表
 * @author luoteng
 * @date 2018年7月9日 下午5:09:49 
 * @version 1.0
 */
@Service("rawCarCheckInService")
public class RawCarCheckInServiceImpl extends BaseService implements IRawCarCheckInService{
		@Resource
		private RawCarCheckInMapper rawCarCheckInMapper;
		
		@Resource
		private RawBarcodeMapper rawBarcodeMapper;

		
		@Resource
		private MSBarCodeMapper mSBarCodeMapper;
		
	  /**
	   * 新增记录
	   * @param baseResource
	   * @return
	   */
		@Override
		public Resp create(RawCarCheckIn rawCarCheckIn){
			rawCarCheckInMapper.create(rawCarCheckIn);
			return success();
		}

	  /**
	   * 删除记录（逻辑删除）
	   * @param baseResource
	   * @return
	   */
		@Override
		public Resp delete(RawCarCheckIn rawCarCheckIn){
			rawCarCheckInMapper.delete(rawCarCheckIn);
			return success();
		}
		
	  /**
	   * 查询列表
	   * @param pager
	   * @param baseResource
	   * @return
	   */
		@Override
		public Pager<RawCarCheckIn> findListByCondition(int page, int rows,RawCarCheckIn condition){
		    Pager<RawCarCheckIn> pager = new Pager<>();
		    pager.setPage(page);
		    pager.setRows(rows);
    		condition.preQuery();
    		long size = rawCarCheckInMapper.queryCount(condition);
    		List<RawCarCheckIn> records = new ArrayList<RawCarCheckIn> ();
    		if(size > 0){
    			records = rawCarCheckInMapper.queryList(pager,condition);
    		}
			pager.setRecords(records);
			pager.setTotalCount(size);
			return pager;
		}

	  /**
	   * 查询单条
	   * @param id
	   * @return
	   */
		@Override
		public RawCarCheckIn findById(String id){
			return rawCarCheckInMapper.queryById(id);
		}
		
	  /**
	   * 修改记录
	   * @param baseResource
	   * @return
	   */
		@Override
		public Resp update(RawCarCheckIn rawCarCheckIn){
			rawCarCheckInMapper.updateBySelect(rawCarCheckIn);
			return success();
		}
		
		/** 
		 * @Title queryByAny
		 * @Description 查询列表
		 * @author luoteng
		 * @date 2018年7月10日:上午11:36:29
		 * @param rawCarCheckIn
		 * @return List<RawCarCheckIn>
		 */
		@Override
		public List<RawCarCheckIn> queryByAny(RawCarCheckIn rawCarCheckIn){			
			return rawCarCheckInMapper.queryByAny(rawCarCheckIn);
		}
		
		/** 
		 * @Title batchInsert
		 * @Description 车辆登记批量新增
		 * @author luoteng
		 * @date 2018年7月10日:上午9:45:40
		 * @param list
		 * @param checkInNo
		 * @param loginName
		 * @return
		 */
		@Transactional
		@Override
		public Resp batchInsert(List<RawCarCheckIn> list, String checkInNo, String loginName) {
			Date now = new Date();
			HashSet<String> allSet = new HashSet<String>();
	    	for(int i = 0 ; i < list.size(); i ++){
	    		RawCarCheckIn tmpInsertOb = list.get(i);
	    		
	    		StringBuffer uniqueStr = new StringBuffer("");
	    		uniqueStr.append(tmpInsertOb.getModel());
	    		uniqueStr.append(tmpInsertOb.getModelType());
	    		if(allSet.contains(uniqueStr.toString())){
	    			Resp resp = new Resp();
	    			resp.setCode(Constant.FAIL);
	    			resp.setMsg("选择的型号、型号类型重复");
	    			return resp;
	    		}else{
	    			allSet.add(uniqueStr.toString());
	    		}
	    	}
	    	
	    	for(int i = 0 ; i < list.size(); i ++){
	    		RawCarCheckIn tmpInsertOb = list.get(i);
	    		
//	    		合同编号、型号、型号类型、需求数量 页面传递的参数已经提供
	    		tmpInsertOb.setCheckInNo(checkInNo);
	    		tmpInsertOb.setActiveFlag("1");
	    		tmpInsertOb.setGmtCreate(now);
	    		tmpInsertOb.setCreateBy(loginName);
//	    		入库数量（个数）
	    		tmpInsertOb.setInAmount(0);
//				是否生成条码： 1：是 0：否
	    		tmpInsertOb.setUserDefined2("0");
	    		
	    		rawCarCheckInMapper.create(tmpInsertOb);
	    	}
	    	
			return success();
		}
				
		/** 
		 * @Title createBarcode
		 * @Description 根据登记单号生成条码
		 * @author luoteng
		 * @date 2018年7月10日:上午11:13:56
		 * @param checkInNo
		 * @return
		 */
		@Transactional
		@Override
		public Resp createBarcode(List<RawCarCheckIn> list, HashMap<String, List<String>> barcodeMap, String loginName){
			Resp resp = new Resp();
			resp.setCode(Constant.SUCCESS);
			Date now = new Date();
			for(RawCarCheckIn tmp : list){
				Integer amount = tmp.getAmount();
				List<String> barCodeList = barcodeMap.get(tmp.getModel());
				for(int i = 0; i < amount; i++){
					RawBarcode rawBarcode = new RawBarcode();
					rawBarcode.setUserDefined2(tmp.getCheckInNo());
					rawBarcode.setUserDefined3(tmp.getCheckInId().toString());
					rawBarcode.setContractNo(tmp.getContractNo());
//					TODO添加默认长度
//					rawBarcode.setAmount(amount);
					rawBarcode.setUnit(tmp.getUserDefined1());
					rawBarcode.setModel(tmp.getModel());
					rawBarcode.setModelDesc(tmp.getModelDesc());
					rawBarcode.setModelType(tmp.getModelType());
					
					rawBarcode.setBarcode(barCodeList.get(i));
					// 状态 0：未打印 1：已打印
					rawBarcode.setStatus("0");
					// 入库状态：0 未入库 1已入库
					rawBarcode.setUserDefined1("0");
					rawBarcode.setCreateBy(loginName);
					rawBarcode.setGmtCreate(now);
					rawBarcode.setActiveFlag("1");
//					供应商名称
					rawBarcode.setUserDefined5(tmp.getUserDefined4());
//	            	是否合格：0-不合格 1-合格
					rawBarcode.setUserDefined6("1");
					
					rawBarcodeMapper.create(rawBarcode);
					
					MSBarCode record = new MSBarCode();
					record.setBarCode(barCodeList.get(i));
					record.setModelCode(tmp.getModel());
					record.setModelType(tmp.getModelType());
					record.setContractNo(tmp.getContractNo());
//					record.setSpecification(condition.getAmount().toString());
					record.setUpdateDate(now);
					record.setBatchCode(tmp.getCheckInNo());
//					条码打印接口表
					mSBarCodeMapper.insertSelective(record);
				}
				
//				是否生成条码： 1：是 0：否
				tmp.setUserDefined2("1");
				rawCarCheckInMapper.updateBySelect(tmp);
			}
			
			return resp;
		}
}
